package com.zenithmind.common.utils;

import java.util.List;
import java.util.function.Supplier;

/**
 * Bean拷贝服务接口
 * 遵循依赖倒置原则：依赖抽象而非具体实现
 * 遵循接口隔离原则：只包含Bean拷贝相关的操作
 */
public interface BeanCopyService {
    
    /**
     * 单个对象拷贝
     * 
     * @param source 源对象
     * @param clazz 目标类型
     * @param <T> 目标类型
     * @return 目标对象
     */
    <T> T copyBean(Object source, Class<T> clazz);
    
    /**
     * 单个对象拷贝（使用Supplier）
     * 
     * @param source 源对象
     * @param supplier 目标对象供应商
     * @param <T> 目标类型
     * @return 目标对象
     */
    <T> T copyBean(Object source, Supplier<T> supplier);
    
    /**
     * 列表对象拷贝
     * 
     * @param sourceList 源对象列表
     * @param clazz 目标类型
     * @param <T> 目标类型
     * @return 目标对象列表
     */
    <T> List<T> copyBeanList(List<?> sourceList, Class<T> clazz);
    
    /**
     * 列表对象拷贝（使用Supplier）
     * 
     * @param sourceList 源对象列表
     * @param supplier 目标对象供应商
     * @param <T> 目标类型
     * @return 目标对象列表
     */
    <T> List<T> copyBeanList(List<?> sourceList, Supplier<T> supplier);
    
    /**
     * 深度拷贝对象
     * 
     * @param source 源对象
     * @param clazz 目标类型
     * @param <T> 目标类型
     * @return 目标对象
     */
    <T> T deepCopyBean(Object source, Class<T> clazz);
    
    /**
     * 拷贝对象属性（忽略null值）
     * 
     * @param source 源对象
     * @param target 目标对象
     */
    void copyPropertiesIgnoreNull(Object source, Object target);
    
    /**
     * 拷贝对象属性（忽略指定属性）
     * 
     * @param source 源对象
     * @param target 目标对象
     * @param ignoreProperties 忽略的属性名
     */
    void copyPropertiesIgnore(Object source, Object target, String... ignoreProperties);
}
